#ifndef SAMA_FUNCTION_H_
#define SAMA_FUNCTION_H_

#include <stdlib.h>						//< NULL标识在这里定义
#include <stdio.h>						//< 标准函数I/O函数库
#include "string.h"						//< memcpy函数会用到的头文件
#include <sys/time.h>
#include <math.h>
#include "../Global_Func/File/File_Deal.h"
#include "../Global_Define.h"
#include "../Global_Func/MEM_Operation/MEM_Operation.h"
#include "../Global_Func/POSIX_Time/POSIX_Time.h"
#include "../Global_Func/LIST/List.h"
#include "../DATA/DATA_Function.h"

/*下位定义SAMA模块顺序表（顺序一定要注意）*/
typedef enum
{
	/*自定义算法模块枚举	UserDefined_Model*/
	TYP_USERDEF,						//< 用户自定义模块

	/*信号源模块枚举		SignalSource_Model*/
	TYP_STEP,							//< 阶跃信号模块
	TYP_RAMP,							//< 斜坡信号模块
	TYP_SINSOURCE,						//< 正弦信号模块
	TYP_SQUA,							//< 方波信号模块
	TYP_SAW,							//< 锯齿波信号模块
	TYP_BROK,							//< 折线信号模块
	TYP_MSQUA,							//< 多段方波信号模块
	TYP_RAND,							//< 随机信号模块
	TYP_PRBS,							//< 伪随机序列信号模块（TOP_calcute新增）
	TYP_FIXPULSE,                       //< 固定脉冲信号模块（控软新增）
	TYP_SETSTEP,                        //< 设定值阶跃信号模块（控软新增）

	/*数学运算模块枚举		Math_Model*/
	TYP_ADD,							//< 加法模块
	TYP_SUB,							//< 减法模块
	TYP_MUL,							//< 乘法模块
	TYP_DIV,							//< 除法模块
	TYP_SQUAROOT,						//< 平方根模块
	TYP_ABS,							//< 绝对值模块
	TYP_EXP,							//< 指数模块
	TYP_POW,							//< 幂函数模块
	TYP_LOG,							//< 对数模块
	TYP_SIN,							//< 三角函数模块
	TYP_ASIN,							//< 反三角函数模块
	TYP_MATHS,							//< 多项式模块
	TYP_ENTHALPY,						//< 焓值计算模块（控软新增）
	TYP_TS,                             //< 调整时间Ts指标计算模块（TOP_calcute新增）
	TYP_ATTRATE,                        //< 衰减率指标计算模块（TOP_calcute新增）

	/*输入输出模块枚举		IO_Model*/
	TYP_AI,								//< 模拟量输入模块
	TYP_AO,								//< 模拟量输出模块
	TYP_DI,								//< 开关量输入模块
	TYP_DO,								//< 开关量输出模块
	TYP_NETAI,							//< 站间通讯模拟量输入模块
	TYP_NETAO,							//< 站间通讯模拟量输出模块
	TYP_NETDI,							//< 站间通讯数字量输入模块
	TYP_NETDO,							//< 站间通讯数字量输出模块			
	TYP_AIGetFile,						//< 数据采集模块（TOP_calcute新增）
	TYP_FW,								//< 文件写入数据模块
	TYP_FR,								//< 文件读取数据模块


	/*逻辑运算模块枚举		Logic_Model*/
	TYP_AND,							//< 逻辑“与”模块
	TYP_OR,								//< 逻辑“或”模块
	TYP_NOT,							//< 逻辑“非”模块
	TYP_XOR,							//< 逻辑“异或”模块
	TYP_SIGN,							//< 符号判断模块
	TYP_RSTRIG,							//< RS触发器模块
	TYP_DTRIG,							//< D触发器模块
	TYP_COUNT,							//< 计数器模块
	TYP_COMPA,							//< 比较器模块
	TYP_ALM,							//< 偏差报警模块
	TYP_IN16OUT1,						//< 16-1模块
	TYP_IN1OUT16,						//< 1-16模块
	TYP_DTOA,							////< 数字量to模拟量模块（控软新增）
	TYP_CONJUDE,                        ////< 控制性能综合判断模块（TOP_calcute新增）
	TYP_IN1OUT32,						//< 1-32模块

	/*选择模块枚举			Choice_Model*/
	TYP_AISEL,							//< 模拟量输入选择模块
	TYP_AOSEL,							//< 模拟量输出选择模块
	TYP_DISEL,							//< 数字量输入选择模块
	TYP_DOSEL,							//< 数字量输出选择模块
	TYP_MIDSEL,							//< 中间值选择模块
	TYP_MAXSEL,							//< 最大值选择模块
	TYP_MINSEL,							//< 最小值选择模块
	TYP_DG2OF3,							//< 数字信号3选2模块
	

	/*控制算法模块枚举		Control_Model*/
	TYP_PID,							//< PID控制模块
	TYP_AManSta,						//< 模拟手动站模块
	TYP_DManSta,						//< 数字手动站模块
	TYP_ASET,							//< 模拟量给定值发生器模块
	TYP_DSET,							//< 数字量给定值发生器模块
	TYP_LeadLag,						//< 超前滞后模块 
	TYP_StepCont,						//< 步序控制模块
	TYP_In8Bala,						//< 输入平衡模块(8IB) 
	TYP_In2Bala,						//< 输入平衡模块(2IB)
	TYP_Trans2,							//< 两变送器整合模块 
	TYP_Trans3,							//< 三变送器整合模块 
	TYP_DEVICE,							//< 设备驱动模块
	TYP_StimuSigCon,					//< 激励信号启停模块（TOP_calcute新增）
	TYP_DMC,							//< DMC模块（TOP_calcute新增）
	TYP_DstrbOn,                        //< 扰动启动模块（TOP_calcute新增）
	TYP_FFDMC,							//< 带前馈的DMC模块

	/*时间算法模块枚举		Time_Model*/
	TYP_TIMER,							//< 定时器模块
	TYP_CYCTIMER,						//< 周期定时器模块
	TYP_TOTAL,							//< 积算器模块
	TYP_TIMEGET,						//< 时间获取模块
	TYP_STACK,							//< 数据堆栈模块
    TYP_PUL,                            //< 脉冲模块
    TYP_DELAYON,                        //< 延时开模块
    TYP_DELAYOFF,                        //< 延时关模块

	/*线性算法模块枚举		Line_Model*/
	TYP_CONST,							//< 常系数模块
	TYP_DELAY,							//< 纯迟延模块
	TYP_INTEG,							//< 积分模块
	TYP_DIFFE,							//< 微分模块
	TYP_CTF1,							//< 连续传递函数1功能块 
	TYP_CTF2,							//< 连续传递函数2功能块 
	TYP_DTF,							//< 离散传递函数模块
	TYP_DISUM,							//< 数字信号加法器功能块
	

	/*非线性算法模块枚举	NonLine_Model*/
	TYP_RANGE,							//< 限幅模块
	TYP_RANGEALM,						//< 幅值报警模块
	TYP_RATE,							//< 速率限制模块
	TYP_RATEALM,						//< 速率报警模块
	TYP_DEAD,							//< 死区模块
	TYP_SWITCH,							//< 开关模块
	TYP_GEARBL,							//< 齿轮间隙模块
	TYP_HYLOOP,							//< 滞环开关模块
	TYP_MAGAMP,							//< 磁放模块
	TYP_MLINE,							//< 分段线性模块
	

	/*设备驱动模块枚举		DeviceDriver_Model*/
	

	/*其他模块枚举			Other_Model*/
	TYP_MAX_MODEL,						//< 当前总模块个数
	

}Model_Type_e;


/*上位定义SAMA模块顺序表（顺序一定要注意）*/
typedef enum
{
	/*自定义算法模块枚举	UserDefined_Model*/
	TYP_USERDEF_UP = 5,					//< 用户自定义模块

	/*信号源模块枚举		SignalSource_Model*/
	TYP_STEP_UP = 100,					//< 阶跃信号模块
	TYP_RAMP_UP,						//< 斜坡信号模块
	TYP_SINSOURCE_UP,					//< 正弦信号模块
	TYP_SQUA_UP,						//< 方波信号模块
	TYP_SAW_UP,							//< 锯齿波信号模块
	TYP_BROK_UP,						//< 折线信号模块
	TYP_MSQUA_UP,						//< 多段方波信号模块
	TYP_RAND_UP,						//< 随机信号模块
	TYP_PRBS_UP,						//< 伪随机序列信号模块			（TOP_calcute新增）
	TYP_FIXPULSE_UP,                    //< 固定脉冲信号模块			（控软新增）
	TYP_SETSTEP_UP,                     //< 设定值阶跃信号模块			（控软新增）

	/*数学运算模块枚举		Math_Model*/
	TYP_ADD_UP = 200,					//< 加法模块
	TYP_SUB_UP,							//< 减法运算模块
	TYP_MUL_UP,							//< 乘法运算模块
	TYP_DIV_UP,							//< 除法运算模块
	TYP_SQUAROOT_UP,					//< 平方根运算模块
	TYP_ABS_UP,							//< 绝对值运算模块
	TYP_EXP_UP,							//< 指数运算模块
	TYP_POW_UP,							//< 幂函数运算模块
	TYP_LOG_UP,							//< 对数运算模块
	TYP_SIN_UP,							//< 三角函数运算模块
	TYP_ASIN_UP,						//< 反三角函数运算模块
	TYP_MATHS_UP,						//< 多项式运算模块
	TYP_ENTHALPY_UP,					//< 焓值计算模块				（控软新增）
	TYP_TS_UP,                          //< 调整时间Ts指标计算模块		（TOP_calcute新增）
	TYP_ATTRATE_UP,                     //< 衰减率指标计算模块			（TOP_calcute新增）

	/*输入输出模块枚举		IO_Model*/
	TYP_AI_UP = 300,					//< 模拟量输入模块
	TYP_AO_UP,							//< 模拟量输出模块
	TYP_DI_UP,							//< 开关量输入模块
	TYP_DO_UP,							//< 开关量输出模块
	TYP_NETAI_UP = 307,					//< 站间通讯模拟量输入模块
	TYP_NETAO_UP,						//< 站间通讯模拟量输出模块
	TYP_NETDI_UP,						//< 站间通讯数字量输入模块
	TYP_NETDO_UP,						//< 站间通讯数字量输出模块	
	TYP_AIGetFile_UP = 333,					//< 数据采集模块
	TYP_FW_UP,							//< 文件写入数据模块
	TYP_FR_UP,							//< 文件读取数据模块

	/*逻辑运算模块枚举		Logic_Model*/
	TYP_AND_UP = 400,					//< 逻辑“与”模块
	TYP_OR_UP,							//< 逻辑“或”模块
	TYP_NOT_UP,							//< 逻辑“非”模块
	TYP_XOR_UP,							//< 逻辑“异或”模块
	TYP_SIGN_UP,						//< 符号判断模块
	TYP_RSTRIG_UP,						//< RS触发器模块
	TYP_DTRIG_UP,						//< D触发器模块
	TYP_COUNT_UP,						//< 计数器模块
	TYP_COMPA_UP,						//< 比较器模块
	TYP_ALM_UP,							//< 偏差报警模块
	TYP_IN16OUT1_UP = 411,				//< 16-1模块
	TYP_IN1OUT16_UP = 416,				//< 1-16模块
	TYP_DTOA_UP = 420,					//< 数字量to模拟量模块			（控软新增）
	TYP_CONJUDE_UP,                     //< 控制性能综合判断模块		（TOP_calcute新增）
	TYP_IN1OUT32_UP,				    //< 1-32模块

	/*选择模块枚举			Choice_Model*/
	TYP_AISEL_UP = 500,					//< 模拟量输入选择模块
	TYP_AOSEL_UP,						//< 模拟量输出选择模块
	TYP_DISEL_UP,						//< 数字量输入选择模块
	TYP_DOSEL_UP,						//< 数字量输出选择模块
	TYP_MIDSEL_UP,						//< 中间值选择模块
	TYP_MAXSEL_UP,						//< 最大值选择模块
	TYP_MINSEL_UP,						//< 最小值选择模块
	TYP_DG2OF3_UP,						//< 数字信号3选2模块


	/*控制算法模块枚举		Control_Model*/
	TYP_PID_UP = 600,					//< PID控制模块
	TYP_AManSta_UP = 602,				//< 模拟手动站模块
	TYP_DManSta_UP,						//< 数字手动站模块
	TYP_ASET_UP,						//< 模拟量给定值发生器模块
	TYP_DSET_UP,						//< 数字量给定值发生器模块
	TYP_LeadLag_UP,						//< 超前滞后模块 
	TYP_StepCont_UP,					//< 步序控制模块
	TYP_In8Bala_UP,						//< 输入平衡模块(8IB) 
	TYP_In2Bala_UP,						//< 输入平衡模块(2IB)
	TYP_Trans2_UP,						//< 两变送器整合模块 
	TYP_Trans3_UP,						//< 三变送器整合模块 
	TYP_DEVICE_UP,						//< 设备驱动模块
	TYP_StimuSigCon_UP,					//< 激励信号启停模块		（TOP_calcute新增）
	TYP_DMC_UP,							//< DMC模块					（TOP_calcute新增）
	TYP_DstrbOn_UP = 615,               //< 扰动启动模块			（TOP_calcute新增）
	TYP_FFDMC_UP = 617,					//< 带前馈的DMC模块

	/*时间算法模块枚举		Time_Model*/
	TYP_TIMER_UP = 700,					//< 定时器模块
	TYP_CYCTIMER_UP,					//< 周期定时器模块
	TYP_TOTAL_UP,						//< 积算器模块
	TYP_TIMEGET_UP,						//< 时间获取模块
	TYP_STACK_UP,						//< 数据堆栈模块
	TYP_PUL_UP,                         //< 脉冲模块
	TYP_DELAYON_UP,                     //< 延时开模块
	TYP_DELAYOFF_UP,                    //< 延时关模块

	/*线性算法模块枚举		Line_Model*/
	TYP_CONST_UP = 800,					//< 常系数模块
	TYP_DELAY_UP,						//< 纯迟延模块
	TYP_INTEG_UP,						//< 积分模块
	TYP_DIFFE_UP,						//< 微分模块
	TYP_CTF1_UP,						//< 连续传递函数1功能块
	TYP_CTF2_UP,						//< 连续传递函数2功能块
	TYP_DTF_UP,							//< 离散传递函数功能块
	TYP_DISUM_UP,						//< 数字信号加法器功能块


	/*非线性算法模块枚举	NonLine_Model*/
	TYP_RANGE_UP = 900,					//< 限幅模块
	TYP_RANGEALM_UP,					//< 幅值报警模块
	TYP_RATE_UP,						//< 速率限制模块
	TYP_RATEALM_UP,						//< 速率报警模块
	TYP_DEAD_UP,						//< 死区模块
	TYP_SWITCH_UP,						//< 开关模块
	TYP_GEARBL_UP,						//< 齿轮间隙模块
	TYP_HYLOOP_UP,						//< 滞环开关模块
	TYP_MAGAMP_UP,						//< 磁放模块
	TYP_MLINE_UP,						//< 分段线性模块


	/*设备驱动模块枚举		DeviceDriver_Model*/


	/*其他模块枚举			Other_Model*/
	TYP_MAX_UP = 1000,					//< 当前总模块个数


}Model_Type_Up_e;


/*输入输出引脚状态枚举量*/
typedef enum {
	IO_NORMAL,							//< 正常
	IO_FORCE,							//< 强制
	IO_HOLD,							//< 保持
}IOSta_e;

/*模块主从备份模式枚举*/
typedef enum {
	BAK_NON,							//< 不备份
	BAK_STA,							//< 备份中间状态参数
	BAK_ATTEND,							//< 通过衰减函数跟随的方式进行
}Bak_Mode_e;

/*模块衰减函数跟随备份模式参数结构体*/
typedef struct {
	unsigned char ATTEND_Amount;		//< 衰减次数
	unsigned char ATTEND_Period;		//< 每次衰减运算相对于基准周期的倍数
}BAK_Attend_Para_t;

/*模块衰减函数跟随备份模式中间变量结构体*/
typedef struct {
	float Diff;							//< 当前仍需衰减的值
	float Delta;						//< 每次衰减的值
	unsigned char Period_Count;			//< 周期轮询计数
}BAK_Attend_Sta_t;

/*定义模块输入（Input）引脚结构体*/
typedef struct {
	float** AI;							//< 指向模拟量的指针的指针
	bool** DI;							//< 指向数字量的指针的指针

	int* AI_Pin_ID;						//< 指向模拟量输入引脚所连接的模块的ID号的指针
	int* AI_Pin_Type;					//< 指向模拟量输入引脚所连接的模块的模块类型的指针
	int* AI_Pin_Num;					//< 指向模拟量输入引脚所连接的模块的引脚号的指针
	   
	int* DI_Pin_ID;						//< 指向数字量输入引脚所连接的模块的ID号的指针
	int* DI_Pin_Type;					//< 指向数字量输入引脚所连接的模块的模块类型的指针
	int* DI_Pin_Num;					//< 指向数字量输入引脚所连接的模块的引脚号的指针

	bool** AI_Pin_QualityInfo;			//< 指向输入引脚所连接的模块的输出的质量传递值的指针的指针
	bool** DI_Pin_QualityInfo;			//< 指向输入引脚所连接的模块的输出的质量传递值的指针的指针
}InputPort_t;


/*定义模块输出（Output）引脚结构体*/
typedef struct {
	float* AO;							//< 指向模拟量的指针
	float* Last_AO;						//< 指向上一时刻模拟量的指针
	bool* DO;							//< 指向数字量的指针
	bool* Last_DO;						//< 指向上一时刻数字量的指针

	BAK_Attend_Sta_t* Attend_Sta;		//< 模块衰减函数跟随备份模式中间变量结构体

	bool A_QualityInfo;					//< 模拟量输出点质量传递值
	bool D_QualityInfo;					//< 数字量输出点质量传递值

	IOSta_e *AO_PinSta;					//< 模拟量输出引脚状态标志
	IOSta_e *DO_PinSta;					//< 数字量输出引脚状态标志
}OutputPort_t;

/*用户自定义算法类型枚举*/
typedef enum {
	USERDEF_TYP_C,						//< C语言编写的动态链接库（格式为.so）
	USERDEF_TYP_PY,						//< python语言编写的脚本文件（格式为.py）
}UserDef_Mod_Type_e;

/*存放用户自定义结构体的信息，只有用户自定义类型模块才使用此结构体，其余模块不使用*/
typedef struct {
	char Mod_Name[4];
	UserDef_Mod_Type_e UserDef_Mod_Type;
	bool(*Calcu_Method)(bool* DI, bool* DO, float* AI, float* AO, float dt, bool* DigitalPara, float* AnalogPara, bool** DigitalSta, float** AnalogSta,char*filename);
	PyObject* pFunc;
}UserDef_Mod_Info_t;


/*点质量传递忽略命令情况枚举*/
typedef enum {
	QUA_TRASFER,						//< 传递
	QUA_NO_TRA_A,						//< 不传递模拟量
	QUA_NO_TRA_D,						//< 不传递数字量
	QUA_NO_TRA_AD						//< 不传递模拟量与数字量
}QuaTranSta_e;

/*模块基本信息结构体*/
typedef struct
{
	List_Base_t List_Base;					//< 链表基本信息结构体
	int PageNum;							//< 模块所在页的页号
	SAMA_Model_IO_Num_t IO_Num;				//< IO引脚数量
	InputPort_t In;							//< 模块输入引脚
	OutputPort_t Out;						//< 模块输出引脚
	bool First_Calcu_Finish;				//< 初次运算完成标志
	QuaTranSta_e QuaTranSta;				//< 点质量传递忽略命令
	int Model_Period;						//< 模块运算周期相对于基准周期的倍数
	int Period_Count;						//< 基本运算周期轮询次数计数
	float dt;								//< 模块的实际运算周期（s）
	long File_Read_Offset;					//< 模块参数在SAMA文件中的指针偏移
	UserDef_Mod_Info_t UserDef_Mod_Info;	//< 用户自定义模块信息结构体
}Model_Base_t;

/*模块所在链表私有参数结构体*/
typedef struct {
	Bak_Mode_e Bak_Mode;				//< 该类型模块主从备份模式
	BAK_Attend_Para_t* para;			//< 衰减函数跟随方式参数结构体指针
}Model_List_Par_t;


/*模块所在链表私有函数结构体*/
typedef struct {
	bool(*CALCU)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);	//< SAMA模块运算函数（如无该功能，直接将该元素设置为NULL即可）
	int(*BCPara)(Model_Base_t* arg, void** Data);											//< SAMA模块参数广播函数（如无该功能，直接将该元素设置为NULL即可）
	int(*ChangePar)(Model_Base_t* arg, void** Data);										//< 在线修改SAMA模块参数函数（如无该功能，直接将该元素设置为NULL即可）
	int(*BAKSta)(Model_Base_t* arg, void** Data);											//< SAMA运算中间参数备份函数（如无该功能，直接将该元素设置为NULL即可）
	int(*ANASta)(Model_Base_t* arg, void** Data);											//< 主站备份的SAMA运算中间参数解析函数（如无该功能，直接将该元素设置为NULL即可）
	void(*InitStaPar)(Model_Base_t* arg);													//< 初始化系统运算中间参数（如无该功能，直接将该元素设置为NULL即可）
	void(*Model_CMD_Deal)(Model_Base_t* arg, void* Data, const char* CMD);					//< 与模块相关的命令字处理函数（如无该功能，直接将该元素设置为NULL即可）
}Model_List_Func_t;


/*定义SAMA模块参数广播设置的结构体*/
typedef struct {
	bool Flg;
	int Count;
}BCSamaPara_Set_t;


/*SAMA部分相关宏定义*/
#define MLIST_PAR(name)			&(Model_List_Par[TYPE(name)])										//< 该类型SAMA模块对应的链表私有参数结构体指针
#define MLIST_FUNC(name)		&(Model_List_Func[TYPE(name)])										//< 该类型SAMA模块对应的链表私有函数结构体指针
#define MODEL_IO_MEMFAIL_DEAL(var)	{if ((var) == NULL) { FreeSAMAIO(base); return LIST_MEMFAIL; }}	//< IO内存开辟失败释放
#define PT(name)				&(name)																//< 获取地址
#define ATTEND_PARA(name)		PT(name##_Attend_Para)												//<  模块衰减跟踪参数结构体指针
#define CALCU_SAMA(name)		name##_CALCU														//< SAMA运算函数宏定义
#define BC_PARA(name)			name##_BCPara														//< 广播SAMA参数函数宏定义
#define BAK_STA(name)			name##_BAKSta														//< 备份SAMA中间运算参数函数宏定义
#define ANA_STA(name)			name##_ANASta														//< 解析备份的SAMA中间运算参数的函数的宏定义
#define CHANGE_PAR(name)		name##_ChangePar													//< 在线修改函数参数宏定义
#define INIT_STAPAR(name)		name##_InitStaPar													//< 初始化系统运算中间参数
#define CMD_DEAL(name)			name##_CMDDEAL														//< 与模块相关的命令字处理函数
//< 广播SAMA模块参数函数公共部分
#define BC_PARA_PUBLIC(name)  \
{\
	if(name != NULL)\
	{\
		int _iLen = 0;\
		MEMWRITE(name->Par, Data[0]);\
		return _iLen;\
	}\
}

//< 备份SAMA模块运算中间参数函数公共部分
#define BAK_STA_PRIVATE(name)  \
{\
	if(name != NULL)\
	{\
		int _iLen = 0;\
		MEMWRITE(name->Sta, Data[0]);\
		return _iLen;\
	}\
}

//< 解析备份的SAMA模块运算中间参数函数公共部分
#define ANA_STA_PRIVATE(name)  \
{\
	if(name != NULL)\
	{\
		int _iLen = 0;\
		MEMREAD(name->Sta, Data[0]);\
		return _iLen;\
	}\
}


/*SAMA变量声明*/
extern List_Tab_t Model_List[TYP_MAX_MODEL];			//< 声明存放SAMA模块链表的结构体数组
extern bool SAMA_PageBCFlag[SAMA_PGE_MAX];				//< 相应页的SAMA模块广播参数（true：广播；false：不广播）
extern int Model_TotalNum;								//< SAMA模块总数量（除了文本模块、页与页之间切换用的模块之外的所有需要下位运算的模块的总数）
extern BCSamaPara_Set_t BCSamaPara_Set;					//< 广播SAMA参数标志位
extern int Model_Calcu_Type[SAMA_MODEL_MAXNUM];			//< SAMA模块运算排序之存储类型的数组
extern unsigned int Model_Calcu_ID[SAMA_MODEL_MAXNUM];	//< SAMA模块运算排序之存储模块ID号的数组
extern int NumOf_Sama_Type[TYP_MAX_MODEL];				//< 各类SAMA模块的数量
extern int Model_Type_Map[TYP_MAX_UP];					//< 该数组存放了上下位模块类型号的映射关系，上位中模块的类型号通过该数组关系转化为下位中类型号使用，未使用的模块初始化为-1
extern bool BCIODataFlg;								//< 广播数据库IO点（软点+硬点）标志


/*SAMA公共函数*/
void FreeSAMAIO(Model_Base_t* base);															//< SAMA模块IO内存释放函数
List_Info_e AddModel(List_Tab_t* arg, unsigned int ID, SAMA_Model_IO_Num_t* IO_PinNum);					//< 增加SAMA模块函数
List_Info_e DelModel(List_Tab_t* arg, unsigned int ID);											//< 删除SAMA模块函数
int BCSAMA(List_Tab_t* arg, unsigned int ID, void** Data, short *BCNum);						//< 广播SAMA函数
int BCSAMAPARA(List_Tab_t* arg, unsigned int ID, void** Data, short *BCNum);					//< 广播SAMA模块参数函数
List_Info_e OnlineChgPar(List_Tab_t *arg, unsigned int ID, unsigned int Model_Type, void* Data, int Data_Size);			//< 在线修改SAMA参数
List_Info_e MODEL_CMD_DEAL(List_Tab_t *arg, unsigned int ID, void* Data, const char* CMD);		//< 与SAMA模块相关的命令字处理
List_Info_e HoldSta(List_Tab_t *arg, unsigned int ID, bool type, int IOIndex);					//< 引脚状态变为保持
List_Info_e ForceSta(List_Tab_t *arg, unsigned int ID, bool type, int IOIndex, void *Data);		//< 引脚状态变为强制
List_Info_e NormalSta(List_Tab_t *arg, unsigned int ID, bool type, int IOIndex);				//< 引脚状态变为正常
int BAKSAMA(List_Tab_t* arg, unsigned int ID, void** Data, short* BakNum);						//< 主站向从站备份
int ANASAMA(List_Tab_t* arg, unsigned int ID, void** Data);										//< 从站解析主站备份来的数据
List_Info_e SetLink(List_Tab_t* arg, unsigned int ID);											//< 建立模块间的连接关系
List_Info_e SAMACALCU(List_Tab_t* arg, unsigned int ID);										//< SAMA模块运算函数
bool Read_SAMA_File();																			//< 读取SAMA文件
void *tCalcu(void* arg);																		//< SAMA运算线程
void* ModelGetSamaIO(unsigned int ID, int IOIndex, int* i);										//< 通过SAMA模块信息推得SAMA软点	
bool ReadSAMAforFTPDMCFile(int ID, int Type);													//< 读SAMA文件时，如果检测到有DMC模块，需要把主站采样好的模型全部传到从站
#endif